Globals = {};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

Globals.fatal = function(msg) {
	try {
		self.location = Client.server + 'error?minima=' + msg.uri();
	} finally {
		throw msg;
	}
}

// Η μέθοδος "sportCheck" ελέγχει την ορθότητα της πόρτας του server σκηνικού.
// Πρόκειται για την πόρτα στην οποία ακούει ο server σκηνικού και πρέπει να
// είναι ένα ακέραιο νούμερο πόρτας που δεν χρησιμοποιείται από άλλη δικτυακή
// διαδικασία, π.χ. 12666.

Globals.sportCheck = function() {
	if (!Globals.hasOwnProperty('sport')) Globals.sport = null;
	else if (Globals.sport === undefined) Globals.sport = null;
	if (Globals.sport === null) Globals.fatal('skiser port udefined');

	if (parseInt(Globals.sport) != Globals.sport) Globals.fatal(Globals.sport + ': invalid skiser port');
	Globals.sport = parseInt(Globals.sport);
	if (Globals.sport < 1000) Globals.fatal(Globals.sport + ': invalid skiser port number');
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Ακολουθούν functions σχετικές με ημερομηνία και ώρα.

// Η function "torams" επιστρέφει το τρέχον timestamp σε milliseconds,
// με όρους της μηχανής στην οποία εκτελείται.

Globals.torams = function() {
	return (new Date).getTime();
}

// Η function "tora" επιστρέφει το τρέχον timestamp σε seconds,
// με όρους της μηχανής στην οποία εκτελείται.

Globals.tora = function() {
	return Math.floor((new Date).getTime() / 1000);
}

// Η function "toramsServer" επιστρέφει το τρέχον timestamp
// σε milliseconds, με όρους του server.

Globals.toramsServer = function() {
	return Globals.torams() + (Client ? Client.timeDif * 1000 : 0);
}

// Η function "toraServer" επιστρέφει το τρέχον timestamp
// σε seconds, με όρους του server.

Globals.toraServer = function() {
	return Globals.tora() + (Client ? Client.timeDif : 0);
}

Globals.pote = function(ts) {
	var tora = Globals.tora();
	var dif = tora - ts;
	if (dif < 60) return 'τώρα';

	if (dif < 3600) {
		var x = parseInt(dif / 60);
		return 'πριν ' + x + ' λεπτ' + (x < 2 ? 'ό' : 'ά');
	}

	if (dif < 86400) {
		var x = parseInt(dif / 3600);
		return 'πριν ' + x + ' ώρ' + (x < 2 ? 'α' : 'ες');
	}
	
	ts = new Date(ts * 1000);
	return Globals.mera(ts) + ', ' + Globals.ora(ts);
}

// Η function "mera" δίνει την τρέχουσα ημερονηνία στη μηχανή που τρέχει.
// Μπορούμε να δώσουμε και συγκεκριμένη ώρα ως παράμετρο.

Globals.mera = function(d) {
	if (d === undefined) d = new Date;
	var s = '';

	var x = d.getDate();
	if (x < 10) s += '0';
	s += x;
	s += '/';

	x = d.getMonth() + 1;
	if (x < 10) s += '0';
	s += x;
	s += '/'; 

	x = d.getFullYear();
	if (x < 2000) s += x;
	else {
		x %= 100;
		if (x < 10) s += '0';
		s += x;
	}

	return s;
}

// Η function "ora" δίνει την τρέχουσα ώρα στη μηχανή που τρέχει.
// Μπορούμε να δώσουμε και συγκεκριμένη ώρα ως παράμετρο.

Globals.ora = function(d) {
	if (d === undefined) d = new Date;
	var s = '';

	var x = d.getHours();
	if (x < 10) s += '0';
	s += x + ':';

	x = d.getMinutes();
	if (x < 10) s += '0';
	s += x + ':';

	x = d.getSeconds();
	if (x < 10) s += '0';
	s += x;

	return s;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g, '');
}

String.prototype.ltrim = function() {
	return this.replace(/^\s+/, '');
}

String.prototype.rtrim = function() {
	return this.replace(/\s+$/, '');
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Η κλήση που ακολουθεί εξυπηρετεί στη λειτουργία άλλων μεθόδων.

;(function() {
	Globals.loginRE = new RegExp('^[a-zA-Z][a-zA-Z0-9_!@#=.:+-]*$');
	Globals.emailRE = new RegExp('^[a-zA-Z0-9_\.-]+\@([a-zA-Z0-9-]+\\.)+([a-zA-Z0-9]{2,4})+$');
	var ipOctet = '(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])';
	Globals.ipRE = new RegExp('^(?:' + ipOctet + '\\.){3}' + ipOctet + '$');
})();

// Η μέθοδος "validIp" ελέγχει ένα string ως προς το εαν είναι
// είναι δεκτό IP. Αν ναι το επιστρέφει, αλλιώς επιστρέφει κενό
// string.

String.prototype.validIp = function() {
	return this.match(Globals.ipRE) ? this + '' : '';
}

// Η μέθοδος "validEmail" ελέγχει ένα string ως email address. Αν
// είναι δεκτό το επιστρέφει, αλλιώς επιστρέφει κενό string.

String.prototype.validEmail = function() {
	return this.match(Globals.emailRE) ? this : '';
}

// Η μέθοδος "validLogin" ελέγχει ένα string ως login name. Αν
// είναι δεκτό το επιστρέφει, αλλιώς επιστρέφει κενό string.

String.prototype.validLogin = function() {
	return this.match(Globals.loginRE) ? this : '';
}

// Η μέθοδος "uri το μετατρέπει ένα string σε μορφή ασφαλή
// ώστε να χρησιμοποιηθεί ως URI component.

String.prototype.uri = function() {
	return encodeURIComponent(this);
}
